{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 前言"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 大家掌握了之前的 Word课程后，基本上可以完成大部分的效果了，但 Word 文档结构确实太复杂了，不可能通过几次课程把所有的内容掌握，我们需要深入的去探索 Word 文档结构，才能做出各种效果。\n",
    "\n",
    "\n",
    "* 本次课程只提供一个超级玩法的思路，不会展开讲述过多内容，掌握了这个方法后，很多效果都是可以做出来的。\n",
    "\n",
    "\n",
    "* 掌握这个方法需要具备一些知识点：\n",
    "\n",
    "\n",
    "1. XML的基础知识（百度搜索，自行学习）\n",
    "\n",
    "\n",
    "2. 工具包 docx 中 oxml 的使用方法（参考 docx_ext.py）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 了解 docx 文件的本质"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "docx文件其实是一个 zip 压缩文件，大家可以按照以下步骤操作：\n",
    "\n",
    "1. 把 Word 文件的扩展名改为 .zip\n",
    "2. 解压缩 zip 文件到目录\n",
    "3. 进入目录，打开文件 word/document.xml\n",
    "\n",
    "\n",
    "* XML 指可扩展标记语言（eXtensible Markup Language）\n",
    "\n",
    "可以看到很多 <> 括号，如下图："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "<img src=\"images/document.xml.png\" align=\"center\"/>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* <w:p> 就是一个段落标记的开始，< /w:p> 是这个段落的结束\n",
    "* 该段落中有 <w:r> 就是文字块（run），"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 实操演示"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 参考课程“04.Word样式布局”的字体演示"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import docx\n",
    "from docx import Document\n",
    "document = Document()\n",
    "# ------- 创建段落1 -------\n",
    "p1 = document.add_paragraph('')\n",
    "# 增加文字块1\n",
    "r1 = p1.add_run('1.Python超人')\n",
    "# 英文字体改为微软雅黑\n",
    "r1.font.name = '微软雅黑'\n",
    "\n",
    "# ------- 创建段落2 -------\n",
    "p2 = document.add_paragraph('')\n",
    "# 增加文字块2\n",
    "r2 = p2.add_run('2.Python超人')\n",
    "# 英文字体改为微软雅黑\n",
    "r2.font.name = '微软雅黑'\n",
    "# 中文字体改为微软雅黑\n",
    "r2._element.rPr.rFonts.set(docx.oxml.ns.qn('w:eastAsia'), '微软雅黑')\n",
    "\n",
    "# 完整的属性：<w:rFonts w:cs=\"微软雅黑\" w:eastAsia=\"微软雅黑\" w:hAnsi=\"微软雅黑\" w:ascii=\"微软雅黑\" w:hint=\"eastAsia\"/>\n",
    "# r2._element.rPr.rFonts.set(docx.oxml.ns.qn('w:cs'), '微软雅黑')\n",
    "# r2._element.rPr.rFonts.set(docx.oxml.ns.qn('w:hint'), 'eastAsia')\n",
    "\n",
    "# 还可以自定义属性，比如：w:python=\"Python超人\"\n",
    "# r2._element.rPr.rFonts.set(docx.oxml.ns.qn('w:python'), 'Python超人')\n",
    "\n",
    "# ---------------------\n",
    "save_file = r'.\\files\\Word_超级玩法.docx'\n",
    "# 保存内存中的document对象到文件\n",
    "document.save(save_file)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 超级玩法的思路"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 我们定一个文档要求实现的目标效果\n",
    "\n",
    "1. 通过 WPS 或者 Office Word 文档工具，制作想要达到的效果，并保存文档\n",
    "\n",
    "2. 将文档的扩展名 .docx 改为 .zip，并解压\n",
    "\n",
    "3. 打开解压后 word/document.xml 文档，找到相关的 xml 标记线索\n",
    "\n",
    "4. 使用 docx.oxml 下的包和对象，按照相关的 xml 标记线索来实现即可\n",
    "\n",
    "* 思路比较容易，但是需要有一些探索精神，遇到问题我们可以通过百度搜索解决"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 思考题\n",
    "\n",
    "\n",
    "#### 打开文件 docx_ext.py 研究以下两个方法 \n",
    "\n",
    "1. def add_bookmark(paragraph, text, name): \n",
    "\n",
    "2. add_hyperlink(paragraph, url, text, tooltip=None, font=None, color=None, underline=True):\n",
    "\n",
    "```python\n",
    "from docx_ext import add_hyperlink, add_bookmark\n",
    "```"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
